package TecMaster;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

import java.util.ArrayList;
import java.util.HashMap;

import TecMaster.Equipamentos.Equipamento;


/**GDA = Gerencia de Arquivos, contem metodos que alteram os arquivos da loja
 * Executando apaga todos os dados gravados nos arquivos.
 * @author igorvcs
 *
 */


public class GDA<E extends Equipamento> implements Serializable {
	private static final long serialVersionUID = 1L;
	/**Cria um novo gda (gerenciador de arquivos) necessario para lidar com metodos static	 * 
	 */
	public GDA(){
		
	}
	/** guarda Um objeto dentro de um arquivo
	 * 
	 * @param object objeto a ser guardado
	 * @param file nome do arquivo onde se vai guardar
	 * @throws FileNotFoundException
	 * @throws IOException
	 */

public void guardaArquivos (Object object, String file) throws FileNotFoundException, IOException{
	ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(
			file));
	out.writeObject(object);
	out.close();
}
/** Verifica se um dado arquivo existe retornado true caso sim e false caso não
 * @param file a string contendo o nome do arquivo a ser testado
 * @return true caso o arquivo exista, false caso não
 */
public boolean verificaArquivos(String file){
	try {
		ObjectInputStream in  = new ObjectInputStream( new FileInputStream (file));
		in.close();
		return true;
	} catch (Exception FileNotFoundException){
		return false;
	}
}
/** Le o arquivo Agenda.dat, metodos de leitura criados separadamente para diminuir a quatidade de warnings presentes em outras
 * partes do codigo
 * @return lido: uma agenda contendo os dados salvos no arquivo Agenda.dat
 * @throws FileNotFoundException
 * @throws IOException
 * @throws ClassNotFoundException
 */

@SuppressWarnings("unchecked")
public Agenda<Equipamento> leArquivosAgenda() throws FileNotFoundException, IOException, ClassNotFoundException{
	ObjectInputStream in  = new ObjectInputStream( new FileInputStream ("Agenda.dat"));
	Agenda lido = (Agenda) in.readObject();
	in.close();
	return lido;
	
}
/** Le o arquivo DadosDosCliente.dat, metodos de leitura criados separadamente para diminuir a quatidade de warnings presentes em outras
 * partes do codigo
 * @return lido: um HashMap<Cliente, ArrayList<E>> contendo os dados salvos no arquivo DadosDosClientes.dat
 * @throws FileNotFoundException
 * @throws IOException
 * @throws ClassNotFoundException
 */
@SuppressWarnings("unchecked")
public HashMap<Cliente, ArrayList<E>> leArquivosClientes() throws FileNotFoundException, IOException, ClassNotFoundException{
	ObjectInputStream in  = new ObjectInputStream( new FileInputStream ("DadosDosClientes.dat"));
	HashMap<Cliente, ArrayList<E>> lido = (HashMap<Cliente, ArrayList<E>>) in.readObject();
	in.close();
	return lido;
	
}
/** Le o arquivo DadosDosCliente.dat, metodos de leitura criados separadamente para diminuir a quatidade de warnings presentes em outras
 * partes do codigo
 * @return lido: um ArrayList<E> contendo os dados salvos no arquivo HistoricoDeEquipamentos.dat
 * @throws FileNotFoundException
 * @throws IOException
 * @throws ClassNotFoundException
 */
@SuppressWarnings("unchecked")
public ArrayList<E> leArquivosHistorico() throws FileNotFoundException, IOException, ClassNotFoundException{
	ObjectInputStream in  = new ObjectInputStream( new FileInputStream ("HistoricoDeEquipamentos.dat"));
	ArrayList<E> lido = (ArrayList<E>) in.readObject();
	in.close();
	return lido;
	
}
/** Le o arquivo Codigo.dat, metodos de leitura criados separadamente para diminuir a quatidade de warnings presentes em outras
 * partes do codigo
 * @return lido: um Integer contendo os dados salvos no arquivo Codigo.dat
 * @throws FileNotFoundException
 * @throws IOException
 * @throws ClassNotFoundException
 */
public Integer leArquivosCodigo() throws FileNotFoundException, IOException, ClassNotFoundException{
	ObjectInputStream in  = new ObjectInputStream( new FileInputStream ("Codigo.dat"));
	Integer lido = (Integer) in.readObject();
	in.close();
	return lido;
	
}
/** Retorna todos os Arquivos a um estado inicial, removendo todos os cadastros e fazendo o codigo retornar a zero
 * @return true para verificação de se ele foi executado
 * @throws FileNotFoundException
 * @throws IOException
 * @throws ClassNotFoundException
 */
public boolean resetarCadastros() throws FileNotFoundException, IOException, ClassNotFoundException {
	Empresa<E> empresa = new Empresa<E>();
	empresa.mapaClientesEquipamentos = new HashMap<Cliente, ArrayList<E>>();
	guardaArquivos(empresa.mapaClientesEquipamentos, "DadosDosClientes.dat");
	guardaArquivos(0, "Codigo.dat");
	Agenda<E> agenda = new Agenda<E>();
	guardaArquivos(agenda, "Agenda.dat");
	empresa.historicoDeEquipamentos = new ArrayList<E>();
	guardaArquivos(empresa.historicoDeEquipamentos, "HistoricoDeEquipamentos.dat");
	return true;

}

public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException{
	
	GDA<Equipamento> gda = new GDA<Equipamento>();
	if(gda.resetarCadastros()){
		System.out.println("Apagou Tudo!");;
	}
	
}


}

